package org.example.gof.proxy.dynamic;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
 * org.example.gof.proxy.dynamic
 *
 * @author 莫磊
 * @description 基于JDK实现的动态代理
 *          优点：代码复用，减少代码量。减少耦合
 * @date 2025/7/28
 */
public class TimeInvocationHandler implements InvocationHandler {

	/**
	 * 目标对象
	 */
	private Object target;

	public TimeInvocationHandler (Object target) {
		this.target = target;
	}
	/**
	 * JDK在底层已经写好了invoke的调用方法
	 *
	 * 当代理对象调用代理方法时候，注册在InvocationHandler调用处理器当中的invoke()方法被调用
	 *
	 * @param proxy 代理对象
	 * @param method 目标对象的目标方法
	 * @param args 目标方法的实参
	 * @return
	 * @throws Throwable
	 */
	@Override
	public Object invoke (Object proxy, Method method, Object[] args) throws Throwable {
		Long beginTime = System.currentTimeMillis();

		// 执行目标方法，可以获取目标方法的返回值进行其他处理
		Object result = method.invoke(target, args);
		Long enTime = System.currentTimeMillis();
		System.out.println("执行时间：" + (enTime - beginTime));
		// 需要返回目标对象的返回值
		return result;
	}
}
